package com.lonely.order.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.lonely.common.core.domain.Select;
import com.lonely.common.core.domain.StatusInfo;
import com.lonely.goods.domain.dto.goods.CopyBomQueryDTO;
import com.lonely.goods.domain.dto.goods.GoodsCreateOrderDTO;
import com.lonely.goods.domain.entity.SysGoods;
import com.lonely.goods.domain.vo.goods.CopyBomQueryVO;
import com.lonely.goods.domain.vo.goods.GoodsQuotationSheetVO;
import com.lonely.order.domain.dto.order.*;
import com.lonely.order.domain.entity.SysOrder;
import com.lonely.order.domain.vo.order.OrderDetailVO;
import com.lonely.order.domain.vo.order.OrderQuantityInfo;
import com.lonely.order.domain.vo.order.OrderStatInfoVO;
import com.lonely.order.domain.vo.order.QueryProduceOrderPageVO;

import java.util.List;

/**
 * 订单服务接口
 * author: fzzf
 */
public interface IOrderService extends IService<SysOrder> {


    /**
     * 同步近一个月的订单数据
     */
    void synchronizerLastMonthOrder();

    /**
     * 同步今天的订单数据
     */
    void synchronizerTodayOrder();

    /**
     * 分页获取订单列表
     *
     * @param queryDto
     * @return
     */
    Page<QueryProduceOrderPageVO> produceOrderPage(QueryProduceOrderPageDTO queryDto);

    /**
     * 获取订单状态下拉框数据
     *
     * @return
     */
    List<Select> getOrderStatusSelect();

    /**
     * 获取订单统计信息
     *
     * @param queryDto
     * @return
     */
    OrderStatInfoVO getOrderStatInfo(QueryProduceOrderPageDTO queryDto);

    /**
     * 根据订单号获取订单数量统计信息
     *
     * @param orderId
     * @return
     */
    OrderQuantityInfo getOrderQuantityInfo(Long orderId);

    /**
     * 接单
     *
     * @param receiveOrderDTO
     */
    void receiveOrders(ReceiveOrderDTO receiveOrderDTO);

    /**
     * 打标
     *
     * @param markingOrderDTO
     */
    void markingOrders(MarkingOrderDTO markingOrderDTO);


    /**
     * 计算工价
     *
     * @param calculateWages
     * @return
     */
    String calculateWages(CalculateWagesDTO calculateWages);


    /**
     * 复制已有bom的数据查询
     *
     * @param queryDto
     * @return
     */
    List<CopyBomQueryVO> copyBomDataQuery(CopyBomQueryDTO queryDto);

    /**
     * 根据订单号获取订单明细
     *
     * @param produceOrderId
     * @return
     */
    OrderDetailVO getOrderDetail(Long produceOrderId);

    /**
     * 订单作废
     *
     * @param invalidOrderDTO
     */
    void invalidOrders(InvalidOrderDTO invalidOrderDTO);

    /**
     * 通知裁床
     *
     * @param produceOrderId
     */
    void notifyCuttingBed(Long produceOrderId);


    /**
     * 基于商品创建订单
     *
     * @param sysGoods
     * @param createOrderDTO
     */
    void createOrderByGoods(SysGoods sysGoods, GoodsCreateOrderDTO createOrderDTO);

    /**
     * 基于订单id获取商品报价单组装数据
     *
     * @param orderId
     * @return
     */
    GoodsQuotationSheetVO getGoodsQuotationSheet(Long orderId);

    /**
     * 判断订单是否是套装
     *
     * @param produceOrderId
     */
    boolean isSuit(Long produceOrderId);

    /**
     * 同步商品报价单部件物料信息到订单中
     *
     * @param sysGoods
     */
    void synchronizedGoodsQuotationSheetPartMaterials(SysGoods sysGoods);

    /**
     * 更新订单状态为车缝中
     *
     * @param produceOrderId
     */
    void updateOrderStatusToInTheCarSeam(Long produceOrderId);

    /**
     * 根据订单号获取对应的订单id集合
     *
     * @param produceOrderIds
     * @return
     */
    List<Long> getOrderIdsByProduceOrderIds(List<Long> produceOrderIds);

    /**
     * 修改订单状态外为尾部中
     *
     * @param orderId
     */
    void updateOrderStatusToInTheTail(Long orderId);

    /**
     * 打印skc贴纸
     *
     * @param printSkcStickerDTO
     * @return
     */
    String printSkcSticker(PrintSkcStickerDTO printSkcStickerDTO);

    /**
     * 根据订单号获取打印skc贴纸 尺码数量信息
     *
     * @param produceOrderId
     * @return
     */
    OrderQuantityInfo getPrintSkcStickerOrderQuantityInfo(Long produceOrderId);

    /**
     * 获取状态侧边栏信息
     *
     * @param queryDto
     * @return
     */
    List<StatusInfo> getStatusInfo(QueryProduceOrderPageDTO queryDto);

    /**
     * 国内大货下单
     *
     * @param produceOrderId
     */
    void domesticBulkGoodsPlaceOrder(Long produceOrderId);

    /**
     * 验证生成计划单的参数
     *
     * @param generatePlanDTO
     * @return
     */
    String validateGeneratePlan(GeneratePlanDTO generatePlanDTO);

    /**
     * 生成计划单
     *
     * @param generatePlanDTO
     */
    void generatePlan(GeneratePlanDTO generatePlanDTO);
}
